using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;

namespace ACFrameworkCS
{
   public class Utilitarios
   {
      #region Proceso con controles visuales
      public static void ACSetControl(ref Panel x_panel, bool x_habilitar)
      {
         for (int i = 0; i < (x_panel.Controls.Count); i++)
         {
            Control l_control = x_panel.Controls[i];
            ACSetControl(ref l_control, x_habilitar);
         }
      }
      public static void ACSetControl(ref GroupBox x_panel, bool x_habilitar)
      {
         for (int i = 0; i < (x_panel.Controls.Count); i++)
         {
            Control l_control = x_panel.Controls[i];
            ACSetControl(ref l_control, x_habilitar);
         }
      }
      public static void ACSetControl(ref Control control, bool x_habilitar)
      {
         if (control is ACControles.ACTextBoxAyuda)
         {
            string l_tagcontrol = control.Tag == null ? "" : control.Tag.ToString().ToUpper();

            if (l_tagcontrol.Contains("V"))
            { ((ACControles.ACTextBoxAyuda)control).Clear(); }

            if (l_tagcontrol.Contains("E"))
            { ((ACControles.ACTextBoxAyuda)control).Enabled = x_habilitar; }
            else if (l_tagcontrol.Contains("R"))
            {
               if (control is ACControles.ACTextBoxAyuda)
               { ((ACControles.ACTextBoxAyuda)control).ReadOnly = x_habilitar; }
            }
         }
         else if (control.HasChildren)
         {
            for (int i = 0; i < (control.Controls.Count); i++)
            {
               Control l_control = control.Controls[i];
               ACSetControl(ref l_control, x_habilitar);
            }
         }
         else
         {
            string l_tagcontrol = control.Tag == null ? "" : control.Tag.ToString().ToUpper();

            if (l_tagcontrol.Contains("N"))
            { ((TextBox)control).Text = "0"; }
            if (l_tagcontrol.Contains("D"))
            { ((TextBox)control).Text = "0.00"; }
            else if (l_tagcontrol.Contains("V"))
            { ((TextBox)control).Clear(); }
            else if (l_tagcontrol.Contains("C"))
            {
               //   ((ComboBox)control) 
            }
            else if (l_tagcontrol.Contains("K"))
            { ((CheckBox)control).Checked = false; }
            else if (l_tagcontrol.Contains("D"))
            { ((DataGridView)control).DataSource = false; }

            if (l_tagcontrol.Contains("E"))
            { control.Enabled = x_habilitar; }
            else if (l_tagcontrol.Contains("R"))
            {
               if (control is TextBox)
               { ((TextBox)control).ReadOnly = !x_habilitar; }
               else if (control is DataGridView)
               { ((DataGridView)control).ReadOnly = !x_habilitar; }
            }
         }
      }

      public static void ConfigurarControl(ref TextBox x_control, bool x_habilitar)
      {
         x_control.Clear();
         x_control.Enabled = x_habilitar;
      }
      public static void ConfigurarControl(ref ComboBox x_control, bool x_habilitar)
      {
         x_control.DataSource = null;
         x_control.Enabled = x_habilitar;
      }
      public static void ConfigurarControl(ref DataGridView x_control, bool x_habilitar)
      {
         x_control.DataSource = null;
         x_control.Enabled = x_habilitar;
      }
      public static void Configurar(ref BindingNavigator x_navigator, bool x_habilitar)
      {
         x_navigator.Enabled = x_habilitar;
      }

      public static void ACSetControl(ref TabPage x_tabpage, bool x_habilitar)
      {
         for (int i = 0; i < (x_tabpage.Controls.Count); i++)
         {
            Control l_control = x_tabpage.Controls[i];
            ACSetControl(ref l_control, x_habilitar);
         }
      }
      #endregion
   }

   /// <summary>
   /// Class used to store the result of an InputBox.Show message.
   /// </summary>
   public class InputBoxResult
   {
      public DialogResult ReturnCode;
      public string Text;
   }

   /// <summary>
   /// Summary description for InputBox.
   /// </summary>
   public class InputBox
   {

      #region Private Windows Contols and Constructor

      // Create a new instance of the form.
      private static Form frmInputDialog;
      private static Label lblPrompt;
      private static Button btnOK;
      private static Button btnCancel;
      private static TextBox txtInput;

      public InputBox()
      {
      }

      #endregion

      #region Private Variables

      private static string _formCaption = string.Empty;
      private static string _formPrompt = string.Empty;
      private static InputBoxResult _outputResponse = new InputBoxResult();
      private static string _defaultValue = string.Empty;
      private static int _xPos = -1;
      private static int _yPos = -1;

      #endregion

      #region Windows Form code

      private static void InitializeComponent()
      {
         // Create a new instance of the form.
         frmInputDialog = new Form();
         lblPrompt = new Label();
         btnOK = new Button();
         btnCancel = new Button();
         txtInput = new TextBox();
         frmInputDialog.SuspendLayout();
         // 
         // lblPrompt
         // 
         lblPrompt.Anchor = ((AnchorStyles)((((AnchorStyles.Top | AnchorStyles.Bottom) | AnchorStyles.Left) | AnchorStyles.Right)));
         lblPrompt.BackColor = SystemColors.Control;
         lblPrompt.Font = new Font("Microsoft Sans Serif", 8.25F, FontStyle.Regular, GraphicsUnit.Point, ((Byte)(0)));
         lblPrompt.Location = new Point(12, 9);
         lblPrompt.Name = "lblPrompt";
         lblPrompt.Size = new Size(302, 82);
         lblPrompt.TabIndex = 3;
         // 
         // btnOK
         // 
         btnOK.DialogResult = DialogResult.OK;
         btnOK.FlatStyle = FlatStyle.Popup;
         btnOK.Location = new Point(326, 8);
         btnOK.Name = "btnOK";
         btnOK.Size = new Size(64, 24);
         btnOK.TabIndex = 1;
         btnOK.Text = "&OK";
         btnOK.Click += new EventHandler(btnOK_Click);
         // 
         // btnCancel
         // 
         btnCancel.DialogResult = DialogResult.Cancel;
         btnCancel.FlatStyle = FlatStyle.Popup;
         btnCancel.Location = new Point(326, 40);
         btnCancel.Name = "btnCancel";
         btnCancel.Size = new Size(64, 24);
         btnCancel.TabIndex = 2;
         btnCancel.Text = "&Cancel";
         btnCancel.Click += new EventHandler(btnCancel_Click);
         // 
         // txtInput
         // 
         txtInput.Location = new Point(8, 100);
         txtInput.Name = "txtInput";
         txtInput.Size = new Size(379, 20);
         txtInput.TabIndex = 0;
         txtInput.Text = "";
         // 
         // InputBoxDialog
         // 
         frmInputDialog.AutoScaleBaseSize = new Size(5, 13);
         frmInputDialog.ClientSize = new Size(398, 128);
         frmInputDialog.Controls.Add(txtInput);
         frmInputDialog.Controls.Add(btnCancel);
         frmInputDialog.Controls.Add(btnOK);
         frmInputDialog.Controls.Add(lblPrompt);
         frmInputDialog.FormBorderStyle = FormBorderStyle.FixedDialog;
         frmInputDialog.MaximizeBox = false;
         frmInputDialog.MinimizeBox = false;
         frmInputDialog.Name = "InputBoxDialog";
         frmInputDialog.ResumeLayout(false);
      }

      #endregion

      #region Private function, InputBox Form move and change size

      static private void LoadForm()
      {
         OutputResponse.ReturnCode = DialogResult.Ignore;
         OutputResponse.Text = string.Empty;

         txtInput.Text = _defaultValue;
         lblPrompt.Text = _formPrompt;
         frmInputDialog.Text = _formCaption;

         // Retrieve the working rectangle from the Screen class
         // using the PrimaryScreen and the WorkingArea properties.
         System.Drawing.Rectangle workingRectangle = Screen.PrimaryScreen.WorkingArea;

         if ((_xPos >= 0 && _xPos < workingRectangle.Width - 100) && (_yPos >= 0 && _yPos < workingRectangle.Height - 100))
         {
            frmInputDialog.StartPosition = FormStartPosition.Manual;
            frmInputDialog.Location = new System.Drawing.Point(_xPos, _yPos);
         }
         else
            frmInputDialog.StartPosition = FormStartPosition.CenterScreen;


         string PrompText = lblPrompt.Text;

         int n = 0;
         int Index = 0;
         while (PrompText.IndexOf("\n", Index) > -1)
         {
            Index = PrompText.IndexOf("\n", Index) + 1;
            n++;
         }

         if (n == 0)
            n = 1;

         System.Drawing.Point Txt = txtInput.Location;
         Txt.Y = Txt.Y + (n * 4);
         txtInput.Location = Txt;
         System.Drawing.Size form = frmInputDialog.Size;
         form.Height = form.Height + (n * 4);
         frmInputDialog.Size = form;

         txtInput.SelectionStart = 0;
         txtInput.SelectionLength = txtInput.Text.Length;
         txtInput.Focus();
      }

      #endregion

      #region Button control click event

      static private void btnOK_Click(object sender, System.EventArgs e)
      {
         OutputResponse.ReturnCode = DialogResult.OK;
         OutputResponse.Text = txtInput.Text;
         frmInputDialog.Dispose();
      }

      static private void btnCancel_Click(object sender, System.EventArgs e)
      {
         OutputResponse.ReturnCode = DialogResult.Cancel;
         OutputResponse.Text = string.Empty; //Clean output response
         frmInputDialog.Dispose();
      }

      #endregion

      #region Public Static Show functions

      static public InputBoxResult Show(string Prompt)
      {
         InitializeComponent();
         FormPrompt = Prompt;

         // Display the form as a modal dialog box.
         LoadForm();
         frmInputDialog.ShowDialog();
         return OutputResponse;
      }

      static public InputBoxResult Show(string Prompt, string Title)
      {
         InitializeComponent();

         FormCaption = Title;
         FormPrompt = Prompt;

         // Display the form as a modal dialog box.
         LoadForm();
         frmInputDialog.ShowDialog();
         return OutputResponse;
      }

      static public InputBoxResult Show(string Prompt, string Title, string Default)
      {
         InitializeComponent();

         FormCaption = Title;
         FormPrompt = Prompt;
         DefaultValue = Default;

         // Display the form as a modal dialog box.
         LoadForm();
         frmInputDialog.ShowDialog();
         return OutputResponse;
      }

      static public InputBoxResult Show(string Prompt, string Title, string Default, int XPos, int YPos)
      {
         InitializeComponent();
         FormCaption = Title;
         FormPrompt = Prompt;
         DefaultValue = Default;
         XPosition = XPos;
         YPosition = YPos;

         // Display the form as a modal dialog box.
         LoadForm();
         frmInputDialog.ShowDialog();
         return OutputResponse;
      }

      #endregion

      #region Private Properties

      static private string FormCaption
      {
         set
         {
            _formCaption = value;
         }
      } // property FormCaption

      static private string FormPrompt
      {
         set
         {
            _formPrompt = value;
         }
      } // property FormPrompt

      static private InputBoxResult OutputResponse
      {
         get
         {
            return _outputResponse;
         }
         set
         {
            _outputResponse = value;
         }
      } // property InputResponse

      static private string DefaultValue
      {
         set
         {
            _defaultValue = value;
         }
      } // property DefaultValue

      static private int XPosition
      {
         set
         {
            if (value >= 0)
               _xPos = value;
         }
      } // property XPos

      static private int YPosition
      {
         set
         {
            if (value >= 0)
               _yPos = value;
         }
      } // property YPos

      #endregion
   }

}
